package com.molichuxing.services.infrastructure.dao;

import com.molichuxing.framework.dao.RootMapper;
import com.molichuxing.framework.dto.TabDto;
import com.molichuxing.services.infrastructure.bean.ContractBean;
import com.molichuxing.services.infrastructure.dto.response.ContractDto;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 合同表 Mapper 接口
 * </p>
 *
 * @author zhaopenghui
 * @since 2019-09-11
 */
public interface ContractMapper extends RootMapper<ContractBean> {

    /**
     * 根据条件分页查询count
     *
     * @param params
     * @return
     */
    long getPageCount(@Param("params") Map<String, Object> params);

    /**
     * 根据条件分页查询
     *
     * @param params
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<ContractBean> getPage(@Param("params") Map<String, Object> params, @Param("pageNum") int pageNum,
                               @Param("pageSize") int pageSize);

    /**
     * 子合同列表
     *
     * @param mainOrderCode
     * @return
     */
    List<ContractBean> getSubList(@Param("mainOrderCode") Long mainOrderCode);

    /**
     * 获取合同信息
     *
     * @param orderCode     订单号
     * @param contractTypes 合同类型
     * @return
     */
    List<ContractBean> getContractList(@Param("orderCode") Long orderCode,
                                       @Param("contractTypes") List<Integer> contractTypes);

    /**
     * 获取合同信息
     *
     * @param orderCode
     * @param contractType
     * @return
     */
    List<ContractBean> getContractListByOrderCode(@Param("orderCode") Long orderCode, @Param("contractType") Integer contractType);

    /**
     * 获取合同信息
     *
     * @param orderCode
     * @param contractType
     * @return
     */
    List<ContractBean> getContractByOrderCode(@Param("orderCode") Long orderCode, @Param("contractType") Integer contractType);

    /**
     * 通过主订单查询合同
     *
     * @param mainOrderCode
     * @param contractType
     * @return
     */
    List<ContractBean> getContractListByMainOrderCode(@Param("mainOrderCode") Long mainOrderCode, @Param("contractType") Integer contractType);

    /**
     * 通过合同编号查询
     *
     * @param contractCode
     * @return
     */
    List<ContractBean> getListByContractCode(@Param("contractCode") String contractCode);

    /**
     * 合同批量添加
     *
     * @param invoiceInfoList
     * @return
     */
    int createContractBatch(List<ContractDto> invoiceInfoList);

    /**
     * 修改合同到期日期
     *
     * @param orderCode
     * @param endTime
     * @return
     */
    int modifyContractEndTime(@Param("orderCode") Long orderCode, @Param("endTime") LocalDate endTime);

    /**
     * 根据订单号修改状态
     *
     * @param orderCode
     * @param contractStatus
     * @return
     */
    int modifyStatusByOrderCode(@Param("orderCode") Long orderCode, @Param("contractStatus") Integer contractStatus);

    /**
     * 根据主订单号修改状态
     *
     * @param mainOrderCode
     * @param contractStatus
     * @return
     */
    int modifyStatusByMainOrderCode(@Param("mainOrderCode") Long mainOrderCode, @Param("contractStatus") Integer contractStatus);

    /**
     * 根据多个订单号查询合同
     *
     * @param orderCodeList
     * @param contractType
     * @return
     */
    List<ContractBean> getContractListByOrderCodeList(@Param("orderCodeList") List<Long> orderCodeList, @Param("contractType") Integer contractType);

    /**
     * 根据状态获取数量
     *
     * @return
     */
    List<TabDto> getContractCountByStatus();

    /**
     * 修改合同状态
     *
     * @param orderCode      订单号
     * @param contractStatus 修改后状态
     * @param contractType   合同类型
     * @return
     */
    int modifyStatus(@Param("orderCode") Long orderCode, @Param("contractStatus") int contractStatus,
                     @Param("contractType") int contractType);

    /**
     * 修改合同状态-批量
     *
     * @param orderCode        订单号
     * @param contractStatus   修改后状态
     * @param contractTypeList 合同类型
     * @return
     */
    int modifyBatchStatus(@Param("orderCode") Long orderCode, @Param("contractStatus") int contractStatus,
                          @Param("contractTypeList") List<Integer> contractTypeList);
}